package com.pai4j.ugc.repository.dao;

import com.pai4j.ugc.repository.entity.CommunityContributionEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 社区共建数据访问接口
 *
 * @author: CYM-pai
 * @date: 2025/07/30 12:00
 **/
@Repository
public interface ICommunityContributionDAO extends JpaSpecificationExecutor<CommunityContributionEntity>, 
        JpaRepository<CommunityContributionEntity, Long> {

    /**
     * 根据提交人查询共建列表
     *
     * @param submitter 提交人
     * @param pageable  分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findBySubmitter(String submitter, Pageable pageable);

    /**
     * 根据处理人查询共建列表
     *
     * @param assignee 处理人
     * @param pageable 分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findByAssignee(String assignee, Pageable pageable);

    /**
     * 根据类型查询共建列表
     *
     * @param type     共建类型
     * @param pageable 分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findByType(Integer type, Pageable pageable);

    /**
     * 根据状态查询共建列表
     *
     * @param status   共建状态
     * @param pageable 分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findByStatus(Integer status, Pageable pageable);

    /**
     * 根据优先级查询共建列表
     *
     * @param priority 优先级
     * @param pageable 分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findByPriority(Integer priority, Pageable pageable);

    /**
     * 根据分类查询共建列表
     *
     * @param category 分类
     * @param pageable 分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findByCategory(String category, Pageable pageable);

    /**
     * 根据提交人和状态查询共建列表
     *
     * @param submitter 提交人
     * @param status    状态
     * @param pageable  分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findBySubmitterAndStatus(String submitter, Integer status, Pageable pageable);

    /**
     * 根据处理人和状态查询共建列表
     *
     * @param assignee 处理人
     * @param status   状态
     * @param pageable 分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findByAssigneeAndStatus(String assignee, Integer status, Pageable pageable);

    /**
     * 根据标题模糊查询共建列表
     *
     * @param title    标题关键词
     * @param pageable 分页信息
     * @return 分页的共建列表
     */
    Page<CommunityContributionEntity> findByTitleContaining(String title, Pageable pageable);

    /**
     * 统计各状态的共建数量
     *
     * @return 状态统计列表
     */
    @Query("SELECT c.status, COUNT(c) FROM CommunityContributionEntity c GROUP BY c.status")
    List<Object[]> countByStatus();

    /**
     * 统计各类型的共建数量
     *
     * @return 类型统计列表
     */
    @Query("SELECT c.type, COUNT(c) FROM CommunityContributionEntity c GROUP BY c.type")
    List<Object[]> countByType();

    /**
     * 统计各优先级的共建数量
     *
     * @return 优先级统计列表
     */
    @Query("SELECT c.priority, COUNT(c) FROM CommunityContributionEntity c GROUP BY c.priority")
    List<Object[]> countByPriority();
}
